home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
snippet.exe
/
X00API.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-03
|
12KB
|
443 lines
/*
* X00API.C: X00 FOSSIL driver
*
* Created by R.F. Pels.
* modified by Bob Stout
* Placed in the public domain.
*/
/* FOSSIL call codes */
#define SET_BAUDRATE 0x0000
#define TX_CHAR 0x0100
#define RX_CHAR 0x0200
#define STATUS 0x0300
#define INITIALIZE 0x0400
#define DEINITIALIZE 0x0500
#define RAISE_DTR 0x0600
#define LOWER_DTR 0x0601
#define GET_SYS_INFO 0x0700
#define FLUSH_OUTPUT 0x0800
#define PURGE_OUTPUT 0x0900
#define PURGE_INPUT 0x0A00
#define TX_CHAR_NOWAIT 0x0B00
#define PEEK_AHEAD_INPUT 0x0C00
#define PEEK_AHEAD_KBD 0x0D00
#define READ_KBD 0x0E00
#define FLOW_CONTROL 0x0F00
#define CTLC_CTLK_CHECK 0x1000
#define SET_CUP 0x1100
#define GET_CUP 0x1200
#define WRITE_ANSI_CHAR 0x1300
#define ENABLE_WATCHDOG 0x1401
#define DISABLE_WATCHDOG 0x1400
#define WRITE_BIOS_CHAR 0x1500
#define INSERT_TICK_FUNC 0x1601
#define DELETE_TICK_FUNC 0x1600
#define BOOT_MACHINE 0x1700
#define READ_BLOCK 0x1800
#define WRITE_BLOCK 0x1900
#define START_BREAK_SIGNAL 0x1A01
#define STOP_BREAK_SIGNAL 0x1A00
#define GET_DRIVER_INFO 0x1B00
#define INSTALL_APPENDAGE 0x7e00
#define REMOVE_APPENDAGE 0x7f00
#include "x00api.h"
#include <dos.h>
static union REGS x00regs;
static struct SREGS x00sregs;
int x00error = 0;
#if __cplusplus
extern "C" {
#endif
#ifdef __ZTC__ /* Zortech's peek() is different from MSC & TC/BC */
#define PEEK(s,o) *((unsigned _far *)(MK_FP((s),(o))))
#endif /* __ZTC__ */
unsigned int x00_detect(void)
{
unsigned int segofx00;
unsigned int ofsofx00;
/* Peek in interrupt vector table for start of FOSSIL */
ofsofx00 = PEEK(0, 0x14 * 4);
segofx00 = PEEK(0, (0x14 * 4) + 2);
/* Peek in start of FOSSIL + 6 */
return (PEEK(segofx00, ofsofx00 + 6));
}
FOSSILSTATUS x00_set(unsigned char set, PORT port)
{
FOSSILSTATUS retval;
x00regs.x.ax = SET_BAUDRATE | set;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
retval.statusword = x00regs.x.ax;
return retval;
}
FOSSILSTATUS x00_tx_char(unsigned char c, PORT port)
{
FOSSILSTATUS retval;
x00regs.x.ax = TX_CHAR | c;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
retval.statusword = x00regs.x.ax;
return retval;
}
unsigned char x00_rx_char(PORT port)
{
x00regs.x.ax = RX_CHAR;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
return (x00regs.x.ax & 0xff);
}
FOSSILSTATUS x00_status(PORT port)
{
FOSSILSTATUS retval;
x00regs.x.ax = STATUS;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
retval.statusword = x00regs.x.ax;
return retval;
}
FOSSILINIT x00_init(PORT port, unsigned char far *ctlc_flagbyte)
{
FOSSILINIT retval;
x00regs.x.ax = INITIALIZE;
if (ctlc_flagbyte != (unsigned char far *)0)
{
x00regs.x.dx = 0x00ff;
x00regs.x.bx = 0x4F50;
segread(&x00sregs);
x00sregs.es = FP_SEG(ctlc_flagbyte);
x00regs.x.cx = FP_OFF(ctlc_flagbyte);
}
else
{
x00regs.x.bx = 0x0000; /* in any case _NOT_ 0x4f50 */
x00regs.x.dx = port;
}
int86x(0x14, &x00regs, &x00regs, &x00sregs);
retval.result = x00regs.x.ax;
retval.max_function = x00regs.x.bx & 0xff;
retval.revision = x00regs.x.bx >> 8;
return retval;
}
void x00_deinit(PORT port)
{
x00regs.x.ax = DEINITIALIZE;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
}
unsigned int x00_raise_dtr(PORT port)
{
unsigned int retval;
x00regs.x.ax = RAISE_DTR;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
if ((x00regs.x.ax & 0x0001) == 1)
{
retval = X00_DTR_HIGH;
}
else retval = X00_DTR_LOW;
return retval;
}
unsigned int x00_lower_dtr(PORT port)
{
unsigned int retval;
x00regs.x.ax = LOWER_DTR;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
if ((x00regs.x.ax & 0x0001) == 1)
{
retval = X00_DTR_HIGH;
}
else retval = X00_DTR_LOW;
return retval;
}
FOSSILSYSINFO x00_sysinfo(void)
{
FOSSILSYSINFO retval;
x00regs.x.ax = GET_SYS_INFO;
int86(0x14, &x00regs, &x00regs);
retval.tick_number = x00regs.x.ax & 0xff;
retval.ticks_per_second = x00regs.x.ax >> 8;
retval.approx_ms_per_tick = x00regs.x.dx;
return retval;
}
void x00_flush_output(PORT port)
{
x00regs.x.ax = FLUSH_OUTPUT;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
}
void x00_purge_output(PORT port)
{
x00regs.x.ax = PURGE_OUTPUT;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
}
void x00_purge_input(PORT port)
{
x00regs.x.ax = PURGE_INPUT;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
}
unsigned int x00_tx_char_nowait(unsigned char c, PORT port)
{
unsigned int retval;
x00regs.x.ax = TX_CHAR_NOWAIT | c;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
if ((x00regs.x.ax & 0x0001) == 1)
{
retval = X00_OK;
}
else retval = X00_CHAR_NOT_SENT;
return retval;
}
unsigned int x00_peek_ahead_input(PORT port)
{
x00regs.x.ax = PEEK_AHEAD_INPUT;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
return x00regs.x.ax;
}
unsigned int x00_peek_ahead_kbd(void)
{
x00regs.x.ax = PEEK_AHEAD_KBD;
int86(0x14, &x00regs, &x00regs);
return x00regs.x.ax;
}
unsigned int x00_read_kbd(void)
{
x00regs.x.ax = READ_KBD;
int86(0x14, &x00regs, &x00regs);
return x00regs.x.ax;
}
void x00_flow_control(FOSSILFLOWCTRL f, PORT port)
{
x00regs.x.ax = FLOW_CONTROL | 0xf0 | f.flowword;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
}
unsigned int x00_ctlc_ctlk_check(FOSSILCTLCCTLK c, PORT port)
{
x00regs.x.ax = CTLC_CTLK_CHECK | c.checkword;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
return x00regs.x.ax;
}
void x00_set_cup(unsigned char row, unsigned char col)
{
x00regs.x.ax = SET_CUP;
x00regs.x.dx = (row << 8) | col;
int86(0x14, &x00regs, &x00regs);
}
void x00_get_cup(unsigned char *row, unsigned char *col)
{
x00regs.x.ax = GET_CUP;
int86(0x14, &x00regs, &x00regs);
*col = x00regs.x.dx & 0xff;
*row = x00regs.x.dx >> 8;
}
void x00_write_ANSI_char(unsigned char c)
{
x00regs.x.ax = WRITE_ANSI_CHAR | c;
int86(0x14, &x00regs, &x00regs);
}
void x00_enable_watchdog(PORT port)
{
x00regs.x.ax = ENABLE_WATCHDOG;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
}
void x00_disable_watchdog(PORT port)
{
x00regs.x.ax = DISABLE_WATCHDOG;
x00regs.x.dx = port;
int86(0x14, &x00regs, &x00regs);
}
void x00_write_BIOS_char(unsigned char c)
{
x00regs.x.ax = WRITE_BIOS_CHAR | c;
int86(0x14, &x00regs, &x00regs);
}
unsigned int x00_insert_tick_func(void (far *tickfunc)())
{
unsigned int retval;
x00regs.x.ax = INSERT_TICK_FU